package com.yifeng.repo.micro.service.server.engine.configure;

import com.baomidou.mybatisplus.annotation.DbType;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

import java.util.List;
import java.util.Map;

@Data
@ConfigurationProperties(value = ServerEngineDaoProperties.PREFIX)
public class ServerEngineDaoProperties {

    public static final String PREFIX = "yfcloud.micro.service.engine.dao";

    /**
     * 是否启用分页插件
     */
    private boolean pageEnabled = true;
    /**
     * 溢出总页数的时候默认是跳到第一页
     */
    private boolean overflow = true;
    /**
     * 单页分页条数限制
     */
    private Long maxLimit = 2000L;
    /**
     * 数据库类型
     */
    private DbType dbType = DbType.MYSQL;
    /**
     * 优化总数查询
     */
    private boolean optimizeJoin = true;
    /**
     * 是否启用SqlLog插件
     */
    private boolean sqlLogEnabled;
    /**
     * SqlLog访问前缀
     */
    private String applicationMappingPrefix;
    /**
     * 是否启用乐观锁插件
     */
    private boolean optimisticLockerEnable;

    /**
     * 是否启用数据保护，并且需要在entity上添加 @TableField(typeHandler = EncryptTypeHandler.class)
     */
    private boolean enableDataEncrypt = false;

    /**
     * 数据源路由类型编号：0. 负载均衡；1. 随机；2. 权重随机
     */
    private int dsRoutingType;
    /**
     * 数据源权重百分比，类似：{"slave_1":30,"slave_2":70}
     */
    private Map<String, Integer> dsRoutingPolicy;

    /**
     * 补充额外的写方法列表，数据源切换的时候写方法不做数据源切换，比如SqlSession自己commit和rollback，当前已经将MybatisPlus的IService里面的部分方法直接加上
     */
    private List<String> extraWriteMethodTargets;

    /**
     * 按省拆库方案中的独立公司编码列表
     */
    private List<String> standaloneCompanyCodes;

    /**
     * 按省拆库方案中的独立库Ds key（对标 @DS 注解里的内容），如果未配置就直接返回独立公司编码
     */
    private String standaloneDsKey;

    /**
     * 按省拆库方案中是否启用跨用户关联（基于动态表名实现）
     */
    private boolean enableCrossUserJoin = false;

    /**
     * 按省拆库方案中跨用户关联的排除省份Ds key列表
     */
    private List<String> crossUserJoinExcludeProvinceDsKeys;

    /**
     * 按省拆库方案中跨用户关联的省库表名列表（支持通配符 * ）
     */
    private List<String> crossUserJoinProvinceTableNames;

    /**
     * 按省拆库方案中跨用户关联的基础库用户名
     */
    private String crossUserJoinCommonUserName = "common";
}


